package main

import (
    "encoding/json"
    "fmt"
    "log"
    "os"
    "strconv"

    "github.com/xuri/excelize/v2"
)

type Property struct {
    Name       string `json:"name"`
    Label      string `json:"label"`
    AccessMode int    `json:"accessMode"`
    Type       int    `json:"type"`
    Params     struct {
        DbNumber  string `json:"dbNumber"`
        DataType  int    `json:"dataType"`
        StartAddr string `json:"startAddr"`
    } `json:"params"`
    Decimals int         `json:"decimals"`
    Unit     string      `json:"unit"`
    Formula  string      `json:"formula"`
    WFormula string      `json:"wFormula"`
    Script   string      `json:"script"`
    Value    interface{} `json:"value"`
}

type Device struct {
    Index      int        `json:"index"`
    Name       string     `json:"name"`
    Label      string     `json:"label"`
    Type       int        `json:"type"`
    Properties []Property `json:"properties,omitempty"`
}

func main() {
    // 打开Excel文件
    f, err := excelize.OpenFile("merged.xlsx")
    if err != nil {
        log.Fatalf("无法打开Excel文件: %v", err)
    }

    // 获取所有Sheet名称
    sheets := f.GetSheetList()
    devices := make(map[string]Device)

    for i, sheet := range sheets {
        rows, err := f.GetRows(sheet)
        if err != nil {
            log.Fatalf("无法读取Sheet: %v", err)
        }

        if len(rows) < 2 {
            continue // 跳过没有数据的Sheet
        }

        device := Device{
            Index: i,
            Name:  rows[1][1],
            Label: rows[1][2],
            Type:  atoi(rows[1][3]),
        }

        for rowIndex, row := range rows[1:] {
            if len(row) < 17 {
                log.Printf("警告: Sheet %s, Row %d 数据不完整，将使用默认值补全", sheet, rowIndex+2)
                row = append(row, make([]string, 17-len(row))...)
            }

            prop := Property{
                Name:       row[4],
                Label:      row[5],
                AccessMode: atoi(row[6]),
                Type:       atoi(row[7]),
                Params: struct {
                    DbNumber  string `json:"dbNumber"`
                    DataType  int    `json:"dataType"`
                    StartAddr string `json:"startAddr"`
                }{
                    DbNumber:  row[8],
                    DataType:  atoi(row[9]),
                    StartAddr: row[10],
                },
                Decimals: atoi(row[11]),
                Unit:     row[12],
                Formula:  row[13],
                WFormula: row[14],
                Script:   row[15],
                Value:    parseValue(row[16]),
            }

            device.Properties = append(device.Properties, prop)
        }

        devices[sheet] = device
    }

    // 将设备数据转换为JSON
    jsonData, err := json.MarshalIndent(devices, "", "    ")
    if err != nil {
        log.Fatalf("无法生成JSON: %v", err)
    }

    // 保存JSON数据到文件
    if err := os.WriteFile("converted.json", jsonData, 0644); err != nil {
        log.Fatalf("无法写入JSON文件: %v", err)
    }

    fmt.Println("转换成功，JSON数据已保存到converted.json")
}

func atoi(s string) int {
    i, err := strconv.Atoi(s)
    if err != nil {
        return 0
    }
    return i
}

func parseValue(s string) interface{} {
    if s == "" || s == "null" {
        return nil
    }
    return s
}


